CXX = g++

SRC = src
INCLUDE = include
LIB = lib
BIN = bin
OBJ = obj

# Opciones de compilación
CPPFLAGS = -Wall -g -I$(INCLUDE)

# Opciones de enlace

LDFLAG = -L$(LIB)  -lpractica

all : knn euclid prot2ppm

#-------------------------------------------------------------------------------------
# Compilación de los ficheros .cpp
#-------------------------------------------------------------------------------------

#compilando func_aux.cpp
$(OBJ)/func_aux.o : $(SRC)/func_aux.cpp $(INCLUDE)/func_aux.h
	$(CXX) -c $(CPPFLAGS) $(SRC)/func_aux.cpp -o $(OBJ)/func_aux.o

#compilando imagenppm.cpp
$(OBJ)/imagenppm.o : $(SRC)/imagenppm.cpp $(INCLUDE)/imagenppm.h
	$(CXX) -c $(CPPFLAGS) $(SRC)/imagenppm.cpp -o $(OBJ)/imagenppm.o

#compilando cto_prototipo.cpp
$(OBJ)/cto_prototipo.o : $(SRC)/cto_prototipo.cpp $(INCLUDE)/cto_prototipo.h
	$(CXX) -c $(CPPFLAGS) $(SRC)/cto_prototipo.cpp -o $(OBJ)/cto_prototipo.o

#compilando prototipo.cpp
$(OBJ)/prototipo.o : $(SRC)/prototipo.cpp $(INCLUDE)/prototipo.h
	$(CXX) -c $(CPPFLAGS) $(SRC)/prototipo.cpp -o $(OBJ)/prototipo.o

# Compilando knn.cpp
$(OBJ)/knn.o : $(SRC)/knn.cpp
	$(CXX) -c $(CPPFLAGS) $(SRC)/knn.cpp -o $(OBJ)/knn.o

# Compilando euclid.cpp
$(OBJ)/euclid.o : $(SRC)/euclid.cpp
	$(CXX) -c $(CPPFLAGS) $(SRC)/euclid.cpp -o $(OBJ)/euclid.o

# Compilando prot2ppm.cpp
$(OBJ)/prot2ppm.o : $(SRC)/prot2ppm.cpp
	$(CXX) -c $(CPPFLAGS) $(SRC)/prot2ppm.cpp -o $(OBJ)/prot2ppm.o

#----------------------------------------------------------------------------------------------
# Creación de bibliotecas
# Nota: La mejor forma de hacerlo es crear una sola biblioteca con todas las clases compiladas
#		y las funciones auxiliares, ya que todos los programas necesitan la misma.
#----------------------------------------------------------------------------------------------

# Creacion de la biblioteca libpractica.a
$(LIB)/libpractica.a : $(OBJ)/cto_prototipo.o $(OBJ)/prototipo.o $(OBJ)/imagenppm.o $(OBJ)/func_aux.o
	ar rsv $(LIB)/libpractica.a $(OBJ)/cto_prototipo.o $(OBJ)/prototipo.o $(OBJ)/imagenppm.o $(OBJ)/func_aux.o

#-------------------------------------------------------------------
# Generación de los ejecutables de los programas
#-------------------------------------------------------------------

#Generando ejecutables

knn : $(BIN)/knn
$(BIN)/knn : $(OBJ)/knn.o $(LIB)/libpractica.a
	$(CXX) $(OBJ)/knn.o $(LDFLAG) -o $(BIN)/knn

euclid : $(BIN)/euclid
$(BIN)/euclid : $(OBJ)/euclid.o $(LIB)/libpractica.a
	$(CXX) $(OBJ)/euclid.o $(LDFLAG) -o $(BIN)/euclid

prot2ppm : $(BIN)/prot2ppm
$(BIN)/prot2ppm : $(OBJ)/prot2ppm.o $(LIB)/libpractica.a
	$(CXX) $(OBJ)/prot2ppm.o $(LDFLAG) -o $(BIN)/prot2ppm

#-------------------------------------------------------------------------------------
# Borra los ficheros objeto
#-------------------------------------------------------------------------------------

clean :

	\rm -rf $(OBJ)/*.o

#-------------------------------------------------------------------------------------
# Deja la estructura original, antes de la primera orden make
#-------------------------------------------------------------------------------------

mrproper :

	\rm -rf $(OBJ)/*.o

	\rm -rf $(LIB)/*.a
	
	\rm -rf $(BIN)/knn
	\rm -rf $(BIN)/euclid
	\rm -rf $(BIN)/prot2ppm
	
#-------------------------------------------------------------------------------------
# Generación de documentación
#-------------------------------------------------------------------------------------

documentacion :
	doxygen Doxyfile

